package cn.edu.jxust.core.domain.repository;

import cn.edu.jxust.common.domain.entity.Device;
import cn.edu.jxust.common.domain.dto.DeviceSiteVo;
import cn.edu.jxust.common.domain.valobj.DeviceVo;
import cn.edu.jxust.common.domain.dto.RegDeviceVo;
import cn.edu.jxust.common.response.Result;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;

/**
 * @author QiuKangming
 * @since 2020-06-29
 */

@SuppressWarnings("all")
public interface DeviceService extends IService<Device> {

    /**
     * 根据区域 id 号获取该区域部署的设备 ids 集合
     * @param areaId 区域id号
     * @return List<Integer>
     */
    List<Integer> getDeviceIdsByAreaId(Integer areaId);

    /**
     * 根据企业 id 号获取该企业部署的设备 ids 集合
     * @param areaId 区域id
     * @param enterpriseId 企业id
     * @return List<Integer>
     */
    List<Integer> getDeviceIdsByAreaIdEnterpriseId(Integer areaId, Integer enterpriseId);

    /**
     * 通过监测点id获得设备id
     * @param siteId 监测点id号
     * @return Integer
     */
    Integer getIdBySiteId(Integer siteId);

    /**
     * 根据 id 查询设备信息
     * @param id 设备id号
     * @return Device
     */
    Result getOneById(Integer id);

    /**
     * 分页获取设备列表 或者 条件查询
     * @param paramMap 查询条件 map
     * @param page 查询第几页
     * @param size 一页查询的记录条数
     * @return IPage<DeviceVo>
     */
    Result getDeviceVoListOrQuery(Map<String, String[]> paramMap, Integer page, Integer size);

    /**
     * 根据 id 删除设备
     * @param id 设备id号
     * @return Result
     */
    Result delById(Integer id);

    /**
     * 新增设备
     * @param deviceVo 设备视图对象
     * @return Result
     */
    Result addDevice(DeviceVo deviceVo);

    /**
     * 修改设备信息
     * @param deviceVo 设备视图对象
     * @return Result
     */
    Result modifyDevice(DeviceVo deviceVo);

    /**
     * 查询未绑定监测点的设备信息
     * @param page 第几页
     * @param size 一页几条数据
     * @return IPage<DeviceVo>
     */
    IPage<DeviceVo> getNoBindingList(Integer page, Integer size);

    /**
     * 判断设备是否绑定
     * @param id 设备id
     * @return boolean
     */
    boolean deviceIsBinding(Integer id);

    /**
     * 通过设备id获取监测点id
     * @param id 设备id
     * @return int
     */
    int getSiteIdById(Integer id);

    /**
     * 设备绑定监测点接口
     * @param deviceSiteVo 设备视图对象
     * @return boolean
     */
    boolean deviceBindingOr(DeviceSiteVo deviceSiteVo);

    /**
     * 根据IMEI更新设备经纬度
     * @param IMEI 设备标识
     * @param LngAndLat 经纬度
     * @return boolean
     */
    boolean updateLngLatByIMEI(String IMEI, double[] LngAndLat);

    /**
     * 根据区域id和企业id查找设备列表信息
     * @param areaId 区域id
     * @param enterpriseId 企业id
     * @return List<Device>
     */
    List<Device> getDeviceByAreaIdAndId(Integer areaId, Integer enterpriseId);

    /**
     * 分页获取待处理设备信息(设备注册)
     * @param page 第几页
     * @param size 一页几条数据
     * @param flg 标志
     * @return IPage<RegDeviceVo>
     */
    IPage<RegDeviceVo> getRegDeviceVoList(Integer page, Integer size, Integer flg);

    /**
     * 待处理设备处理操作, 完善设备信息
     * @param deviceVo 设备视图对象
     * @return Result
     */
    Result doWait(DeviceVo deviceVo);

    /**
     * 保存注册请求设备基本信息到数据库
     * @param regDeviceVo 注册设备基本信息对象
     * @return Result
     */
    Result saveRegDevice(RegDeviceVo regDeviceVo);

    /**
     * 根据 区域id和企业id查询该企业下的设备个数
     * @param areaId 区域id
     * @param EnterpriseId 企业id
     * @return int
     */
    int checkDeviceCountByAreaIdAndEnterpriseId(Integer areaId, Integer enterpriseId);

    /**
     * 根据当前登录的用户获取该用户所拥有的设备id的权限，默认返回第一个
     * @return Integer 第一个设备的id号
     */
    Integer getDefaultDeviceId();

}
